#ifndef __ITHREAD_H__
#define __ITHREAD_H__

#include <lampe/config.h>
#include <lampe/types.h>
#include <lampe/IReferenceCounted.h>
#include "ITask.h"
namespace lampe{
namespace thread{

#ifdef POSIX_LIBLARY
    typedef pthread_t ThreadID;
#endif

#ifdef WINDOWS_PLATFORM
    typedef unsigned long ThreadID;
#endif


/***
 * @class IThread
 * Класс, реализующий работу потока
 * **/
class IThread:public virtual IReferenceCounted{
public:
    /***
     * запускает поток. Если поток уже был запущен, то повторный вызов ни к чему не привидёт
     * **/
    virtual void start()=0;

    /***
     * останавливает поток. Если поток уже был остановлен, то повторный вызов ни к чему не привидёт
     * **/
    virtual void stop()=0;

    /***
     * Метод который застовляет ждать поток откуда вызван метод окончания действия данного потока.
     * Если вызвать для УЖЕ остановившегося потоке, то вызов ни к чему не привидёт.
     *
     * @param timeOut время (мс) в течении которого вызвавший поток будет ожидать завершения. Если вызываемый поток не закончился в течении указанного времени, то функция вернёт FALSE, если успел завершиться, то TRUE
     * @param timeOutStep интервал времени (мс) через который будет проверятся закончил ли выполнение поток. Имеет смысль только при timeOut>0
     * @return TRUE если поток успешно закончился, иначе FALSE. Имеет смысл проверять результат функции только если параметр timeOut>0
     * */
    virtual bool wait(lampe::u32 timeOut=0,lampe::u32 timeOutStep=10)=0;

    /***
     * Возвращяет статус работы потока
     *
     * @return TRUE если поток выполняется, иначе FALSE
     * **/
    virtual bool isRunning()=0;

    /***
     * Возвращяет от менён ли поток
     *
     * @return TRUE если поток отменён, иначе FALSE
     * **/
    virtual bool cancel()=0;

    /***
     * Устанавливает статус отмены потока
     *
     * @param value TRUE если поток отменён, иначе FALSE
     * **/
    virtual void cancel(bool value)=0;
    virtual bool abort(lampe::u32 timeOut=0,lampe::u32 timeOutStep=10)=0;
};



void runTask(ITask task);
IThread*createThread(ITask task);
ThreadID currentID();
void sleep(lampe::u32 ms);

}//namespace thread
}//namespace lampe

#endif
